/**
 * Toast提示系统 (Toast)
 * 
 * 功能说明：
 * - 提供轻量级的消息提示功能
 * - 支持不同位置的提示显示
 * - 自动消失的动画效果
 * - 全局统一的提示管理
 * 
 * 设计模式：
 * - 单例模式 (Singleton Pattern) - 通过ToastManager
 * - 对象池模式 (Object Pool Pattern) - 复用Toast对象
 * - 状态模式 (State Pattern) - Toast状态管理
 * 
 * 特点：
 * - 非阻塞式提示，不影响用户操作
 * - 支持自定义显示位置
 * - 自动播放显示和隐藏动画
 * - 可配置的显示时长
 * 
 * 使用场景：
 * - 操作成功提示
 * - 错误信息提示
 * - 网络状态提示
 * - 游戏状态提示
 * - 系统消息提示
 */

using System.Collections;   
using UnityEngine;
using TMPro;

namespace Game.UI
{
    /**
     * Toast显示位置枚举
     * 
     * 定义Toast提示可以显示的位置
     */
    public enum ToastPosition
    {
        Top,        // 顶部显示
        Center,     // 中央显示
        Bottom,     // 底部显示（默认）
    }

    /**
     * Toast提示组件
     * 
     * 负责单个Toast提示的显示和动画控制
     * 内部类，通过ToastManager进行管理
     */
    internal class Toast : MonoBehaviour
    {
        /**
         * Toast状态枚举
         * 
         * 定义Toast提示的各种状态
         */
        public enum ToastState
        {
            None,       // 初始状态
            Showing,    // 显示中
            Hiding,     // 隐藏中
            Hidden,     // 已隐藏
        }

        /**
         * 动画组件
         * 
         * 控制Toast的显示和隐藏动画
         */
        [SerializeField]
        private Animation _animation;

        /**
         * 显示停留时间
         * 
         * Toast显示后停留的时间（秒）
         * 超过此时间后开始隐藏动画
         */
        [SerializeField]
        private float showTime = 0.3f;

        /**
         * Toast显示位置
         * 
         * 当前Toast的显示位置
         */
        private ToastPosition _position = ToastPosition.Bottom;

        /**
         * 文本组件
         * 
         * 显示Toast提示内容的文本组件
         */
        [SerializeField]
        private TextMeshProUGUI text;

        /**
         * Toast当前状态
         * 
         * 只读属性，外部可以查询Toast的当前状态
         */
        public ToastState State
        {
            get;
            private set;
        }

        /**
         * 动画总时长
         * 
         * 获取动画片段的完整时长
         */
        public float Duration 
        {
            get => _animation.clip.length;
        }

        /**
         * 设置Toast文本内容
         * 
         * 参数：
         * - text: 要显示的文本内容
         */
        public void SetText(string text)
        {
            this.text.text = text;
        }

        /**
         * 设置Toast显示位置
         * 
         * 参数：
         * - position: 显示位置枚举值
         */
        public void SetPosition(ToastPosition position)
        {
            _position = position;
        }

        /**
         * 静态显示方法
         * 
         * 功能：
         * - 通过ToastManager显示Toast提示
         * - 提供便捷的全局访问方式
         * 
         * 参数：
         * - text: 要显示的文本内容
         * - position: 显示位置，默认为底部
         * 
         * 使用示例：
         * Toast.Show("操作成功！");
         * Toast.Show("网络连接失败", ToastPosition.Center);
         */
        public static void Show(string text, ToastPosition position = ToastPosition.Bottom)
        {
            ToastManager.Instance.ShowToast(text, position);
        }

        /**
         * 显示Toast
         * 
         * 功能：
         * - 激活Toast对象
         * - 设置显示状态
         * - 播放显示动画
         * - 启动显示协程
         */
        public void Show()
        {
            // 激活Toast对象
            this.gameObject.SetActive(true);
            
            // 设置显示状态
            State = ToastState.Showing;
            
            // 播放显示动画
            _animation.Play();

            // 启动协程控制显示时长和状态
            StartCoroutine(ShowCoroutine());
        }

        /**
         * 显示协程
         * 
         * 功能：
         * - 控制Toast的显示时长
         * - 管理Toast的状态转换
         * - 自动处理隐藏逻辑
         * 
         * 工作流程：
         * 1. 等待显示停留时间
         * 2. 切换到隐藏状态
         * 3. 等待隐藏动画完成
         * 4. 停止动画并设置隐藏状态
         */
        private IEnumerator ShowCoroutine()
        {
            // 等待显示停留时间
            yield return new WaitForSeconds(showTime);
            
            // 切换到隐藏状态
            State = ToastState.Hiding;

            // 等待隐藏动画完成
            yield return new WaitForSeconds(Duration - showTime);
            
            // 停止动画并设置隐藏状态
            _animation.Stop();
            State = ToastState.Hidden;
        }

        /**
         * 隐藏Toast
         * 
         * 功能：
         * - 立即隐藏Toast对象
         * - 重置状态为初始状态
         * - 通常由ToastManager调用
         */
        public void Hide()
        {
            // 隐藏Toast对象
            this.gameObject.SetActive(false);
            
            // 重置状态
            State = ToastState.None;
        }
    }
}   